﻿#include "Mainwindow_view.h"

//生成随机数：
#include <qrandom.h>



Mainwindow_view::Mainwindow_view(QWidget* parent)
	:QWidget(parent)
{
	this->setWindowTitle("Model view");


	this->resize(640, 480);


	init();
}

void Mainwindow_view::init()
{
	//布局初始化：
	layoutinit();
}

void Mainwindow_view::layoutinit()
{
	m_listview = new QListView;
	m_treeview = new QTreeView;
	m_tableview = new QTableView;

	//布局函数：
	QGridLayout* layout = new QGridLayout(this);
	layout->addWidget(m_listview, 0, 0);
	layout->addWidget(m_treeview, 0, 1);
	layout->addWidget(m_tableview, 1, 0);

	//创建模型：
	m_model = new QStandardItemModel(this);
	//一个模型可以由多个视图进行显示：
	m_listview->setModel(m_model);
	m_treeview->setModel(m_model);
	m_tableview->setModel(m_model);


	
	


	//general_view_layout();

	Targeted_treeview_layout();

}

void Mainwindow_view::general_view_layout()
{
	//设置头数据：
			//1.水平头：	
	//m_model->setHeaderData(0, Qt::Orientation::Horizontal/*水平*/, "名字");
	m_model->setHorizontalHeaderItem(0, new QStandardItem("名字"));

	//2.垂直头：
	m_model->setVerticalHeaderLabels({ "1" });



	//添加行：
		//1.追加一行数据：
	m_model->appendRow(new QStandardItem("李飞"));	//append就是追加，追加在最后面；

	//还是追加一行，这一行有多个数据：
	QList<QStandardItem* > items;
	for (int i = 0; i < 5; i++)
	{
		items.append(new QStandardItem(QString::number(QRandomGenerator::global()->bounded(9999, 99999)/* 随机数的范围是参数1	到	参数2 */)/* 生成随机数 */));
	}
	m_model->appendRow(items);//追加一行数据
	/*
	这里就好玩了，三个视图对于这个有不同的显示：
		listview是列表视图，所以如果追加的一行中有很多数据的时候，它只显示第一个数据；
		treeview是树视图，追加它的一行有多少数据就显示多少数据，这一行的数据以		不知多大格式的空格		隔开；
		tableview是表格视图，它也和数视图一样，追加的这一行有多少数据，就显示多少，和数视图不同的是	每个数据用表格隔开；
	*/


	//2.设置一行数据：
	m_model->setItem(0, 0, new QStandardItem("李琪"));


	//3.1插入一行数据：
	m_model->insertRow(0, new QStandardItem("可乐"));	//插入到指定为止，之前的数据依次往后挪

	//3.2插入多行数据：
	m_model->insertRows(m_model->rowCount() - 1/*获取当前最后一行的行号*/, 10/*插入多少行*/);
	/*
	在表格视图中	看的直观，但是在树视图中，也不知道到底有多少行；
	*/




	//添加列：
		//1.追加多列：		追加列只能添加多列；
	m_model->appendColumn({ new QStandardItem("c/c++"),new QStandardItem("qt") });	//append是追加，所以此时追加在最后的列里；

}

void Mainwindow_view::Targeted_treeview_layout()
{
	//搞一个像解决方案的树结构视图：
	auto pitem = new QStandardItem("Model view_(list,tree,table)view");

	pitem->appendRow(new QStandardItem("bin"));
	pitem->appendRow(new QStandardItem("out"));
	pitem->appendRow(new QStandardItem("CMakeLists.txt"));
	pitem->appendRow(new QStandardItem("CMakeSettings.json"));
	pitem->appendRow(new QStandardItem("main.cpp"));
	pitem->appendRow(new QStandardItem("Mainwindow.cpp"));
	pitem->appendRow(new QStandardItem("Mainwindow.h"));

	//添加视图：
	m_model->appendRow(pitem);
	/*
		treeview树视图正常显示，呈树状结构；
		listview 和 tableview	正常只显示第一行；
	*/




	pitem = new QStandardItem("Model view_(list,tree,table)view_2");

	pitem->appendRow(new QStandardItem("bin"));
	pitem->appendRow(new QStandardItem("out"));
	pitem->appendRow(new QStandardItem("CMakeLists.txt"));
	pitem->appendRow(new QStandardItem("CMakeSet tings.json"));
	pitem->appendRow(new QStandardItem("main.cpp"));
	pitem->appendRow(new QStandardItem("Mainwindow.cpp"));
	pitem->appendRow(new QStandardItem("Mainwindow.h"));

	m_model->appendRow(pitem);

	//设置item的属性：	这个设置属性的行为	在所有视图中都能使用；
	pitem->setCheckable(true);		//设置是否可以被选中；
	/*此时pitem是一个行的数据，所以只有一行可以被选中，		而且pitem属于是给三个视图都添加数据了，	所以设置完可以被选中后，其中一个视图的该行被选中，其他视图中也显示被选中了*/




	//上面的只是设置一行被选中，		这次通过列表来实现树结构的	所有子树叶	被选中：	
	QStringList itemstr = { "bin","out","CMakeLists.txt","CMakeSet tings.json","main.cpp","Mainwindow.cpp","Mainwindow.h" };

	auto spitem = new QStandardItem("Model view_(list,tree,table)view_3");
	//还可以设置图标：
	spitem->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_FileDialogBack));

	for (auto str : itemstr)
	{
		auto item = new QStandardItem(str);
		spitem->appendRow(item);

		//设置item的属性	是可以被选中：
		item->setCheckable(true);



		//设置每一行的图标：
		item->setIcon(style()->standardIcon(QStyle::StandardPixmap::SP_FileDialogBack));
	}
	m_model->appendRow(spitem);




}

